#include <iostream>
using namespace std;

const int N = 200010;
char expr[N];           // 获取输入的表达式
char pexp[N];           //输入的表达式转化成的后缀表达式
char opst[N];           //运算符栈
int opt = 0;            //运算符栈顶
int numst[N], numt = 0; //运算数栈
int k = 0;              //用来标记后缀表达式字符串现在操作的数据的下标，在后缀表达式字符串的生成和后缀表达式的运算中都会用到

bool is_num(char ch) //判断是否是数字字符串
{
    return ch >= '0' && ch <= '9';
}

void trans()
{
    k = 0;                                //后缀表达式字符串的索引，因为这里要从0开始往里面输入元素，所以初始化为0
    for (int i = 0; expr[i] != '\0'; ++i) //遍历输入字符串
    {
        if (is_num(expr[i])) //如果是数字，就依次放入后缀表达式字符串中
        {
            while (is_num(expr[i]))
                pexp[k++] = expr[i++];
            --i;             //因为循环最后要++，所以这里要--
            pexp[k++] = '#'; //以#结尾，区分相邻的数字
        }
        else if (expr[i] == '(') //括号的优先级最高，所以不论如何都是直接放到栈里面去
        {
            opst[opt++] = expr[i]; //左括号进栈
        }
        else if (expr[i] == ')') //括号里面的优先级最高，故而，如果是右括号
        {
            while (opst[opt - 1] != '(') //那就一直出栈到找到左括号为止
                pexp[k++] = opst[--opt]; //将所有运算符出栈并且加入到后缀表达式字符串中去
            opt--;                       //最后得将左括号出栈
        }
        else if (expr[i] == '+' || expr[i] == '-')
        {
            while (!(opt == 0 || opst[opt - 1] == '(')) //只要栈不是空或者栈顶元素为左括号
                pexp[k++] = opst[--opt];                //那就将栈顶元素出栈到后缀表达式中
            opst[opt++] = expr[i];                      //再将此操作符入栈
        }
        else
        {
            while (!(opt == 0 || opst[opt - 1] == '+' || opst[opt - 1] == '-' || opst[opt - 1] == '(')) //只要不是加减反括号
                pexp[k++] = opst[--opt];                                                                //那就优先级比现阶段要入栈的符号高，直接出栈
            opst[opt++] = expr[i];                                                                      //保证此操作符的优先级最高的前提下入栈
        }
    }
    while (opt != 0)             //如果整个输入的表达式遍历完了，操作符栈内还有元素
        pexp[k++] = opst[--opt]; //那么就将操作符栈所有元素出栈并且放在后缀表达式里面
    return;
}

int comp()
{
    k = 0;                  //接下来要从下标零开始遍历全部的后缀表达式字符串
    int num = 0;            //用来作为字符串转数字的中间载体
    int a, b;               //用来从栈中取得两个用于计算的数
    while (pexp[k] != '\0') //只要后缀字符串还没有被遍历完
    {
        if (is_num(pexp[k])) //当读的字符是一个数字时
        {
            num = pexp[k++] - '0'; //就将其转化为数字并非且赋值给num
            while (pexp[k] != '#') //之后直到#为止，都是同一个数字的不同位
                num = num * 10 + pexp[k++] - '0';
            ++k;                 //最后别忘了把#也整过去
            numst[numt++] = num; //最后将算得的数字入数字栈
        }
        else if (pexp[k] == '+')
        {
            b = numst[--numt];     //因为b在后面，所以b后进栈，所以b先出栈
            a = numst[--numt];     //同理，a后出栈
            numst[numt++] = a + b; //将运算结果入栈
            ++k;
        }
        else if (pexp[k] == '-')
        {
            b = numst[--numt];     //因为b在后面，所以b后进栈，所以b先出栈
            a = numst[--numt];     //同理，a后出栈
            numst[numt++] = a - b; //将运算结果入栈
            ++k;
        }
        else if (pexp[k] == '*')
        {
            b = numst[--numt];     //因为b在后面，所以b后进栈，所以b先出栈
            a = numst[--numt];     //同理，a后出栈
            numst[numt++] = a * b; //将运算结果入栈
            ++k;
        }
        else if (pexp[k] == '/')
        {
            b = numst[--numt];     //因为b在后面，所以b后进栈，所以b先出栈
            a = numst[--numt];     //同理，a后出栈
            numst[numt++] = a / b; //将运算结果入栈
            ++k;
        }
    }
    return numst[0]; //如果后缀表达式合法的话，最后一定是只有一个在栈顶
}

int main()
{
    cin >> expr;
    trans();              //将中缀表达式转后缀表达式
    cout << pexp << endl; //输出转化后的中缀表达式
    cout << comp();       //输出最后计算的结果
    return 0;
}